import math

from modelscope import AutoModelForCausalLM, AutoTokenizer, GenerationConfig

# Note: The default behavior now has injection attack prevention off.
tokenizer = AutoTokenizer.from_pretrained("../LLM/qwen/Qwen-1_8B-Chat", revision='master', trust_remote_code=True)

# use auto mode, automatically select precision based on the device.
model = AutoModelForCausalLM.from_pretrained("../LLM/qwen/Qwen-1_8B-Chat", revision='master', device_map="auto", trust_remote_code=True, bf16=True).eval()

systemPromots="""你是一名助手，帮助我使用无人机的AirSim模拟器。
当我要求你做某事时，你应该给我使用AirSim完成任务所需的Python代码，然后解释该代码的作用。
您只能使用我为您定义的函数。
你不能使用任何其他你认为可能存在的假设函数。
您可以使用math和numpy等库中的简单Python函数。

以下我定义的函数，是一些可以用来指挥无人机的功能：
aw.takeoff() - 起飞无人机。
aw.land() - 降落无人机。
aw.get_drone_position() - 将无人机的当前位置返回为与X、Y、Z坐标相对应的3个浮点数。
aw.fly_to([X, Y, Z]) - 将无人机飞行到指定的位置，该位置由对应于X、Y、Z坐标的三个参数组成。
aw.fly_path(points) - 使无人机沿着点数组指定的路径飞行。每个点也是一个由3个浮点数组成的数组，这些浮点数对应于X、Y、Z坐标。
aw.set_yaw(yaw) - 将无人机的偏航设置为以度为单位的指定值。
aw.get_yaw() - 以度为单位返回无人机的当前偏航。
aw.get_position(object_name): 以一个字符串作为输入，指示感兴趣对象的名称，并返回一个由3个浮点数组成的数组，指示其X、Y、Z坐标。

根据轴惯例，正向表示正X轴。右侧表示正Y轴。向上表示正Z轴。
无人机向左移动：Y轴减少数值
无人机向右移动：Y轴增加数值
无人机向上移动：Z轴增加数值
无人机向下移动：Z轴减少数值
无人机向后移动：X轴减少数值
无人机向前移动：X轴增加数值
"""

promots="根据一下内容，输出Python代码："
history2=[("向上移动10个单位","""```python
aw.fly_to([aw.get_drone_position()[0], aw.get_drone_position()[1], aw.get_drone_position()[2]+10])
```"""),("向上移动15个单位","""```python
aw.fly_to([aw.get_drone_position()[0], aw.get_drone_position()[1], aw.get_drone_position()[2]+15])
```"""),("向下移动8个单位","""```python
aw.fly_to([aw.get_drone_position()[0], aw.get_drone_position()[1], aw.get_drone_position()[2]-8])
```"""),("起飞无人机","""```python
aw.takeoff()
```"""),("降落无人机","""```python
aw.land()
```"""),("回到原点","""```python
aw.fly_to([0, 0, 0])
```"""),]

response, history2 = model.chat(tokenizer, systemPromots+promots+"\n\n向右移动30个单位", history=history2, system=systemPromots)
print("2----------------->",response)
